﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

namespace Fractals
{
	public partial class App : Application
	{
		Grid rootVisual;
		MainPage mainPage;
		ExceptionDisplayControl exceptionDisplay;
		public App()
		{
			this.Startup += this.Application_Startup;
			this.Exit += this.Application_Exit;
			this.UnhandledException += this.Application_UnhandledException;

			ArgusControls.ControlTheme.Source = ArgusControls.ControlTheme.ThemeBlack;

			InitializeComponent();
		}

		private void Application_Startup(object sender, StartupEventArgs e)
		{
			//System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("de-CH");
			this.rootVisual = new Grid();
			this.rootVisual.Background = new SolidColorBrush(Colors.Black);
			this.mainPage = new MainPage();
			this.exceptionDisplay = new ExceptionDisplayControl();
			this.exceptionDisplay.ExceptionWindowButtonBack.Click += ExceptionWindowButtonBack_Click;
			this.exceptionDisplay.Visibility = Visibility.Collapsed;
			this.rootVisual.Children.Add(this.mainPage);
			this.rootVisual.Children.Add(this.exceptionDisplay);
			this.RootVisual = this.rootVisual;
		}

		void ExceptionWindowButtonBack_Click(object sender, RoutedEventArgs e)
		{
			this.exceptionDisplay.Visibility = Visibility.Collapsed;
			this.mainPage.Visibility = Visibility.Visible;
		}

		private void Application_Exit(object sender, EventArgs e)
		{

		}

		private void Application_UnhandledException(object sender, ApplicationUnhandledExceptionEventArgs e)
		{
			// Wenn die Anwendung außerhalb des Debuggers ausgeführt wird, melden Sie die Ausnahme mithilfe
			// des Ausnahmemechanismus des Browsers. In IE wird hier ein gelbes Warnsymbol in der 
			// Statusleiste angezeigt, Firefox zeigt einen Skriptfehler an.
			if (!System.Diagnostics.Debugger.IsAttached)
			{

				// Hinweis: So kann die Anwendung weiterhin ausgeführt werden, nachdem eine Ausnahme ausgelöst, aber nicht
				// behandelt wurde. 
				// Bei Produktionsanwendungen sollte diese Fehlerbehandlung durch eine Anwendung ersetzt werden, die 
				// den Fehler der Website meldet und die Anwendung beendet.
				//e.Handled = true;
				//Deployment.Current.Dispatcher.BeginInvoke(delegate { ReportErrorToDOM(e); });
				//MessageBox.Show(e.ExceptionObject.Message);
				e.Handled = true;
				this.mainPage.Visibility = Visibility.Collapsed;
				this.exceptionDisplay.tbException.Text = e.ExceptionObject.ToString();
				this.exceptionDisplay.Visibility = Visibility.Visible;
			}
		}

		private void ReportErrorToDOM(ApplicationUnhandledExceptionEventArgs e)
		{
			try
			{
				string errorMsg = e.ExceptionObject.Message + e.ExceptionObject.StackTrace;
				errorMsg = errorMsg.Replace('"', '\'').Replace("\r\n", @"\n");

				System.Windows.Browser.HtmlPage.Window.Eval("throw new Error(\"Unhandled Error in Silverlight Application " + errorMsg + "\");");
			}
			catch (Exception)
			{
			}
		}
	}
}
